package cn.wolfcode.web.Interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContextUtil;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class CheckPermissionInterceptor implements HandlerInterceptor {
    //前置拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取员工对象

        //Employee emp =(Employee) request.getSession().getAttribute("USER_IN_SESSION");
        //用工具类代替
        Employee emp = UserContextUtil.getUserContext();
        //判断是不是超管,如果是放行
        if(emp.isAdmin()){
            return true;
        }
        //判断拦截的方法 是不是handler方法,如果是就强转获取上面的注解信息
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod =(HandlerMethod) handler ;
            RequiredPermission methodAnnotation = handlerMethod.getMethodAnnotation(RequiredPermission.class);
            //判断有没有这个注解,有代表需要权限,没有就代表不需要权限直接放行
            if (methodAnnotation == null){
                return true;
            }
            //如果有注解表示这个方法需要权限
            //判断访问者权限够不够
            //从Session中取出这个用户的权限表达式

            //List<String> expressions =(List<String>)request.getSession().getAttribute("EXPRESSION_IN_SESSION");
            //通过工具类获取
            List<String> expressions = UserContextUtil.getPermission();
            //从注解中获取到权限表达式
            String expression = methodAnnotation.expression();
            //查看这个权限表达式有没有在用户权限集合中
            if(expressions.contains(expression)){
              //如果含有这个表达式表示拥有权限 放行
              return true;
            }
        }
        //到了这里表示没权限不放行
        //跳转页面提示没有权限
        //不可以使用重定向或请求转发直接访问页面,这样会导致没样式
        //先跳到后端控制器在跳转页面
        response.sendRedirect("/noPermission");
        return false;
    }
}
